{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "VR2Lvo4EHL0p"
      },
      "source": [
        "##### Copyright 2020 Google"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "cellView": "form",
        "id": "_T9QnFcLHM6X"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fxCMG_D4GNmG"
      },
      "source": [
        "# Landscape analysis"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "HlVuKWCNHZkH"
      },
      "source": [
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://www.example.org/cirq/experiments/qaoa/landscape_analysis\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />View on QuantumLib</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/quantumlib/ReCirq/blob/master/docs/qaoa/landscape_analysis.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://github.com/quantumlib/ReCirq/blob/master/docs/qaoa/landscape_analysis.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a href=\"https://storage.googleapis.com/tensorflow_docs/ReCirq/docs/qaoa/landscape_analysis.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />Download notebook</a>\n",
        "  </td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XPjEBYRKHppK"
      },
      "source": [
        "## Setup\n",
        "\n",
        "Install the ReCirq package:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "id": "uXGu8mbaHqiP"
      },
      "outputs": [],
      "source": [
        "try:\n",
        "    import recirq\n",
        "except ImportError:\n",
        "    !pip install git+https://github.com/quantumlib/ReCirq"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "lCmRb3suHyxC"
      },
      "source": [
        "Now import Cirq, ReCirq and the module dependencies:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "id": "R4xXqQBKH1iH"
      },
      "outputs": [],
      "source": [
        "import recirq\n",
        "import cirq\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "\n",
        "from datetime import datetime"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rBhIQDeXGNmI"
      },
      "source": [
        "## Load the raw data\n",
        "\n",
        "Go through each record, load in supporting objects, flatten everything into records, and put into a massive dataframe."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "id": "712qKWMqGNmJ"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>timestamp</th>\n",
              "      <th>bitstrings</th>\n",
              "      <th>qubits</th>\n",
              "      <th>final_qubits</th>\n",
              "      <th>execution_time</th>\n",
              "      <th>problem</th>\n",
              "      <th>problem_type</th>\n",
              "      <th>dataset_id</th>\n",
              "      <th>device_name</th>\n",
              "      <th>n_shots</th>\n",
              "      <th>gamma</th>\n",
              "      <th>beta</th>\n",
              "      <th>line_placement_strategy</th>\n",
              "      <th>generation_task.dataset_id</th>\n",
              "      <th>generation_task.device_name</th>\n",
              "      <th>instance_i</th>\n",
              "      <th>n_qubits</th>\n",
              "      <th>ro</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>2020-04-09 15:37:00.869235</td>\n",
              "      <td>[[1, 0, 1, 1], [0, 0, 0, 0], [0, 1, 0, 0], [1,...</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>0.313614</td>\n",
              "      <td>(2, 0, 1, 3)</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>-0.628319</td>\n",
              "      <td>None</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Sycamore23</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>{'timestamp': 2020-04-09 15:36:56.335579, 'tas...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2020-04-09 15:37:04.727655</td>\n",
              "      <td>[[0, 0, 1, 1], [1, 0, 0, 0], [0, 0, 1, 0], [1,...</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>0.275332</td>\n",
              "      <td>(2, 0, 1, 3)</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.314159</td>\n",
              "      <td>-0.314159</td>\n",
              "      <td>None</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Sycamore23</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>{'timestamp': 2020-04-09 15:36:56.335579, 'tas...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2020-04-09 15:36:57.983027</td>\n",
              "      <td>[[1, 0, 0, 0], [1, 0, 0, 0], [0, 1, 1, 1], [0,...</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>0.318986</td>\n",
              "      <td>(2, 0, 1, 3)</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.942478</td>\n",
              "      <td>-0.471239</td>\n",
              "      <td>None</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Sycamore23</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>{'timestamp': 2020-04-09 15:36:56.335579, 'tas...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>2020-04-09 15:37:01.812070</td>\n",
              "      <td>[[0, 1, 1, 1], [1, 0, 1, 0], [0, 1, 1, 1], [1,...</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>0.269333</td>\n",
              "      <td>(2, 0, 1, 3)</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.942478</td>\n",
              "      <td>0.628319</td>\n",
              "      <td>None</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Sycamore23</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>{'timestamp': 2020-04-09 15:36:56.335579, 'tas...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>2020-04-09 15:35:08.025959</td>\n",
              "      <td>[[0, 0, 1, 0], [1, 0, 1, 0], [1, 1, 1, 0], [1,...</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>[(5, 3), (6, 2), (6, 3), (6, 4)]</td>\n",
              "      <td>0.254191</td>\n",
              "      <td>(2, 0, 1, 3)</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.314159</td>\n",
              "      <td>0.314159</td>\n",
              "      <td>None</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Sycamore23</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>{'timestamp': 2020-04-09 15:34:55.692246, 'tas...</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                   timestamp  \\\n",
              "0 2020-04-09 15:37:00.869235   \n",
              "1 2020-04-09 15:37:04.727655   \n",
              "2 2020-04-09 15:36:57.983027   \n",
              "3 2020-04-09 15:37:01.812070   \n",
              "4 2020-04-09 15:35:08.025959   \n",
              "\n",
              "                                          bitstrings  \\\n",
              "0  [[1, 0, 1, 1], [0, 0, 0, 0], [0, 1, 0, 0], [1,...   \n",
              "1  [[0, 0, 1, 1], [1, 0, 0, 0], [0, 0, 1, 0], [1,...   \n",
              "2  [[1, 0, 0, 0], [1, 0, 0, 0], [0, 1, 1, 1], [0,...   \n",
              "3  [[0, 1, 1, 1], [1, 0, 1, 0], [0, 1, 1, 1], [1,...   \n",
              "4  [[0, 0, 1, 0], [1, 0, 1, 0], [1, 1, 1, 0], [1,...   \n",
              "\n",
              "                             qubits                      final_qubits  \\\n",
              "0  [(5, 3), (6, 2), (6, 3), (6, 4)]  [(5, 3), (6, 2), (6, 3), (6, 4)]   \n",
              "1  [(5, 3), (6, 2), (6, 3), (6, 4)]  [(5, 3), (6, 2), (6, 3), (6, 4)]   \n",
              "2  [(5, 3), (6, 2), (6, 3), (6, 4)]  [(5, 3), (6, 2), (6, 3), (6, 4)]   \n",
              "3  [(5, 3), (6, 2), (6, 3), (6, 4)]  [(5, 3), (6, 2), (6, 3), (6, 4)]   \n",
              "4  [(5, 3), (6, 2), (6, 3), (6, 4)]  [(5, 3), (6, 2), (6, 3), (6, 4)]   \n",
              "\n",
              "   execution_time       problem         problem_type        dataset_id  \\\n",
              "0        0.313614  (2, 0, 1, 3)  HardwareGridProblem  2020-03-tutorial   \n",
              "1        0.275332  (2, 0, 1, 3)  HardwareGridProblem  2020-03-tutorial   \n",
              "2        0.318986  (2, 0, 1, 3)  HardwareGridProblem  2020-03-tutorial   \n",
              "3        0.269333  (2, 0, 1, 3)  HardwareGridProblem  2020-03-tutorial   \n",
              "4        0.254191  (2, 0, 1, 3)  HardwareGridProblem  2020-03-tutorial   \n",
              "\n",
              "       device_name  n_shots     gamma      beta line_placement_strategy  \\\n",
              "0  Syc23-simulator    50000  0.000000 -0.628319                    None   \n",
              "1  Syc23-simulator    50000  0.314159 -0.314159                    None   \n",
              "2  Syc23-simulator    50000  0.942478 -0.471239                    None   \n",
              "3  Syc23-simulator    50000  0.942478  0.628319                    None   \n",
              "4  Syc23-simulator    50000  0.314159  0.314159                    None   \n",
              "\n",
              "  generation_task.dataset_id generation_task.device_name  instance_i  \\\n",
              "0           2020-03-tutorial                  Sycamore23           0   \n",
              "1           2020-03-tutorial                  Sycamore23           0   \n",
              "2           2020-03-tutorial                  Sycamore23           0   \n",
              "3           2020-03-tutorial                  Sycamore23           0   \n",
              "4           2020-03-tutorial                  Sycamore23           0   \n",
              "\n",
              "   n_qubits                                                 ro  \n",
              "0         4  {'timestamp': 2020-04-09 15:36:56.335579, 'tas...  \n",
              "1         4  {'timestamp': 2020-04-09 15:36:56.335579, 'tas...  \n",
              "2         4  {'timestamp': 2020-04-09 15:36:56.335579, 'tas...  \n",
              "3         4  {'timestamp': 2020-04-09 15:36:56.335579, 'tas...  \n",
              "4         4  {'timestamp': 2020-04-09 15:34:55.692246, 'tas...  "
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from recirq.qaoa.experiments.p1_landscape_tasks import \\\n",
        "    DEFAULT_BASE_DIR, DEFAULT_PROBLEM_GENERATION_BASE_DIR, DEFAULT_PRECOMPUTATION_BASE_DIR, \\\n",
        "    ReadoutCalibrationTask\n",
        "\n",
        "records = []\n",
        "ro_records = []\n",
        "for record in recirq.iterload_records(dataset_id=\"2020-03-tutorial\", base_dir=DEFAULT_BASE_DIR):\n",
        "    record['timestamp'] = datetime.fromisoformat(record['timestamp'])\n",
        "    dc_task = record['task']\n",
        "    \n",
        "    if isinstance(dc_task, ReadoutCalibrationTask):\n",
        "        ro_records.append(record)\n",
        "        continue\n",
        "    \n",
        "    pgen_task = dc_task.generation_task    \n",
        "    problem = recirq.load(pgen_task, base_dir=DEFAULT_PROBLEM_GENERATION_BASE_DIR)['problem']\n",
        "    record['problem'] = problem.graph\n",
        "    record['problem_type'] = problem.__class__.__name__\n",
        "    record['bitstrings'] = record['bitstrings'].bits\n",
        "    recirq.flatten_dataclass_into_record(record, 'task')\n",
        "    recirq.flatten_dataclass_into_record(record, 'generation_task')    \n",
        "    records.append(record)\n",
        "    \n",
        "# Associate each data collection task with its nearest readout calibration\n",
        "for record in sorted(records, key=lambda x: x['timestamp']):\n",
        "    record['ro'] = min(ro_records, key=lambda x: abs((x['timestamp']-record['timestamp']).total_seconds()))\n",
        "    \n",
        "df_raw = pd.DataFrame(records)    \n",
        "df_raw.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "USX63LGZGNmQ"
      },
      "source": [
        "## Narrow down to relevant data\n",
        "\n",
        "Drop unnecessary metadata and use bitstrings to compute the expected value of the energy. In general, it's better to save the raw data and lots of metadata so we can use it if it becomes necessary in the future."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "7d10i0SQGNmR"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>timestamp</th>\n",
              "      <th>problem_type</th>\n",
              "      <th>dataset_id</th>\n",
              "      <th>device_name</th>\n",
              "      <th>n_shots</th>\n",
              "      <th>gamma</th>\n",
              "      <th>beta</th>\n",
              "      <th>instance_i</th>\n",
              "      <th>n_qubits</th>\n",
              "      <th>energy</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>2020-04-09 15:37:00.869235</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>-0.628319</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>-0.001450</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>2020-04-09 15:37:04.727655</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.314159</td>\n",
              "      <td>-0.314159</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>-1.186133</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>2020-04-09 15:36:57.983027</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.942478</td>\n",
              "      <td>-0.471239</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>-1.275730</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>2020-04-09 15:37:01.812070</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.942478</td>\n",
              "      <td>0.628319</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>0.789333</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>2020-04-09 15:35:08.025959</td>\n",
              "      <td>HardwareGridProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.314159</td>\n",
              "      <td>0.314159</td>\n",
              "      <td>0</td>\n",
              "      <td>4</td>\n",
              "      <td>1.179826</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>358</th>\n",
              "      <td>2020-04-09 15:41:13.099781</td>\n",
              "      <td>SKProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.785398</td>\n",
              "      <td>-0.785398</td>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>2.174503</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>359</th>\n",
              "      <td>2020-04-09 15:41:20.826151</td>\n",
              "      <td>SKProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>-0.314159</td>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>0.010952</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>360</th>\n",
              "      <td>2020-04-09 15:43:10.625181</td>\n",
              "      <td>SKProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.785398</td>\n",
              "      <td>-0.628319</td>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>1.957544</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>361</th>\n",
              "      <td>2020-04-09 15:43:18.326221</td>\n",
              "      <td>SKProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.314159</td>\n",
              "      <td>-0.314159</td>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>-0.808255</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>362</th>\n",
              "      <td>2020-04-09 15:45:17.505543</td>\n",
              "      <td>SKProblem</td>\n",
              "      <td>2020-03-tutorial</td>\n",
              "      <td>Syc23-simulator</td>\n",
              "      <td>50000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0</td>\n",
              "      <td>3</td>\n",
              "      <td>-0.004189</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>363 rows × 10 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "                     timestamp         problem_type        dataset_id  \\\n",
              "0   2020-04-09 15:37:00.869235  HardwareGridProblem  2020-03-tutorial   \n",
              "1   2020-04-09 15:37:04.727655  HardwareGridProblem  2020-03-tutorial   \n",
              "2   2020-04-09 15:36:57.983027  HardwareGridProblem  2020-03-tutorial   \n",
              "3   2020-04-09 15:37:01.812070  HardwareGridProblem  2020-03-tutorial   \n",
              "4   2020-04-09 15:35:08.025959  HardwareGridProblem  2020-03-tutorial   \n",
              "..                         ...                  ...               ...   \n",
              "358 2020-04-09 15:41:13.099781            SKProblem  2020-03-tutorial   \n",
              "359 2020-04-09 15:41:20.826151            SKProblem  2020-03-tutorial   \n",
              "360 2020-04-09 15:43:10.625181            SKProblem  2020-03-tutorial   \n",
              "361 2020-04-09 15:43:18.326221            SKProblem  2020-03-tutorial   \n",
              "362 2020-04-09 15:45:17.505543            SKProblem  2020-03-tutorial   \n",
              "\n",
              "         device_name  n_shots     gamma      beta  instance_i  n_qubits  \\\n",
              "0    Syc23-simulator    50000  0.000000 -0.628319           0         4   \n",
              "1    Syc23-simulator    50000  0.314159 -0.314159           0         4   \n",
              "2    Syc23-simulator    50000  0.942478 -0.471239           0         4   \n",
              "3    Syc23-simulator    50000  0.942478  0.628319           0         4   \n",
              "4    Syc23-simulator    50000  0.314159  0.314159           0         4   \n",
              "..               ...      ...       ...       ...         ...       ...   \n",
              "358  Syc23-simulator    50000  0.785398 -0.785398           0         3   \n",
              "359  Syc23-simulator    50000  0.000000 -0.314159           0         3   \n",
              "360  Syc23-simulator    50000  0.785398 -0.628319           0         3   \n",
              "361  Syc23-simulator    50000  0.314159 -0.314159           0         3   \n",
              "362  Syc23-simulator    50000  0.000000  0.000000           0         3   \n",
              "\n",
              "       energy  \n",
              "0   -0.001450  \n",
              "1   -1.186133  \n",
              "2   -1.275730  \n",
              "3    0.789333  \n",
              "4    1.179826  \n",
              "..        ...  \n",
              "358  2.174503  \n",
              "359  0.010952  \n",
              "360  1.957544  \n",
              "361 -0.808255  \n",
              "362 -0.004189  \n",
              "\n",
              "[363 rows x 10 columns]"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from recirq.qaoa.simulation import hamiltonian_objectives\n",
        "\n",
        "def compute_energies(row):\n",
        "    permutation = []\n",
        "    qubit_map = {}\n",
        "    final_qubit_index = {q: i for i, q in enumerate(row['final_qubits'])}\n",
        "    for i, q in enumerate(row['qubits']):\n",
        "        fi = final_qubit_index[q]\n",
        "        permutation.append(fi)\n",
        "        qubit_map[i] = q\n",
        "        \n",
        "    return hamiltonian_objectives(row['bitstrings'], \n",
        "                                  row['problem'], \n",
        "                                  permutation,\n",
        "                                  row['ro']['calibration'],\n",
        "                                  qubit_map)\n",
        "\n",
        "# Start cleaning up the raw data\n",
        "df = df_raw.copy()\n",
        "df = df.drop(['line_placement_strategy', \n",
        "              'generation_task.dataset_id', \n",
        "              'generation_task.device_name'], axis=1)\n",
        "\n",
        "# Compute energies\n",
        "df['energies'] = df.apply(compute_energies, axis=1)\n",
        "df = df.drop(['bitstrings', 'problem', 'ro', 'qubits', 'final_qubits'], axis=1)\n",
        "df['energy'] = df.apply(lambda row: np.mean(row['energies']), axis=1)\n",
        "\n",
        "# We won't do anything with raw energies right now\n",
        "df = df.drop('energies', axis=1)\n",
        "\n",
        "# Do timing somewhere else\n",
        "df = df.drop([col for col in df.columns if col.endswith('_time')], axis=1)\n",
        "\n",
        "df"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2W0xD1ZuGNmX"
      },
      "source": [
        "## Compute theoretical landscape\n",
        "\n",
        "Use a simulator to compute the noiseless landscape. This can get quite expensive, so it would be better practice to factor this out into Tasks in their own right: https://github.com/quantumlib/ReCirq/issues/21"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "id": "TvVo6jehGNmY"
      },
      "outputs": [],
      "source": [
        "def get_problem_graph(problem_type,\n",
        "                    n=None,\n",
        "                    instance_i=0):\n",
        "    if n is None:\n",
        "        if problem_type == 'HardwareGridProblem':\n",
        "            n = 4\n",
        "        elif problem_type == 'SKProblem':\n",
        "            n = 3\n",
        "        elif problem_type == 'ThreeRegularProblem':\n",
        "            n = 4\n",
        "        else:\n",
        "            raise ValueError(repr(problem_type))\n",
        "    \n",
        "    r = df_raw[\n",
        "        (df_raw['problem_type']==problem_type)&\n",
        "        (df_raw['n_qubits']==n)&\n",
        "        (df_raw['instance_i']==instance_i)\n",
        "    ]['problem']\n",
        "    return r.iloc[0]\n",
        "\n",
        "\n",
        "from recirq.qaoa.simulation import exact_qaoa_values_on_grid, lowest_and_highest_energy\n",
        "import itertools\n",
        "\n",
        "def compute_exact_values(problem_type, x_grid_num=23, y_grid_num=21):\n",
        "    exact = exact_qaoa_values_on_grid(\n",
        "        graph=get_problem_graph(problem_type),\n",
        "        num_processors=12,\n",
        "        x_grid_num=x_grid_num,\n",
        "        y_grid_num=y_grid_num,\n",
        "    ).T.reshape(-1)\n",
        "    \n",
        "    exact_gammas = np.linspace(0, np.pi/2, x_grid_num)\n",
        "    exact_betas  = np.linspace(-np.pi/4, np.pi/4, y_grid_num)\n",
        "    exact_points = np.asarray(list(itertools.product(exact_gammas, exact_betas)))\n",
        "    min_c, max_c = lowest_and_highest_energy(get_problem_graph(problem_type))\n",
        "    return exact_points, exact, min_c, max_c\n",
        "\n",
        "EXACT_VALS_CACHE = {k: compute_exact_values(k) \n",
        "                    for k in ['HardwareGridProblem', 'SKProblem', 'ThreeRegularProblem']}"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-ve-NefQGNmb"
      },
      "source": [
        "## Plot"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "id": "b3no_VisGNmc"
      },
      "outputs": [],
      "source": [
        "%matplotlib inline\n",
        "from matplotlib import pyplot as plt\n",
        "\n",
        "import seaborn as sns\n",
        "sns.set_style('ticks')\n",
        "\n",
        "plt.rc('axes', labelsize=16, titlesize=16)\n",
        "plt.rc('xtick', labelsize=14)\n",
        "plt.rc('ytick', labelsize=14)\n",
        "plt.rc('legend', fontsize=14, title_fontsize=16)\n",
        "\n",
        "# Note: I ran into https://github.com/matplotlib/matplotlib/issues/15410\n",
        "# if I imported matplotlib before using multiprocessing in `exact_qaoa_values_on_grid`, YMMV."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "id": "eh1eIY32GNmg"
      },
      "outputs": [],
      "source": [
        "import scipy.interpolate\n",
        "\n",
        "def plot_landscape(problem_type, res=200, method='nearest', cmap='PuOr'):\n",
        "    dfb = df\n",
        "    dfb = dfb[dfb['problem_type'] == problem_type]\n",
        "    xx, yy = np.meshgrid(np.linspace(0, np.pi/2, res), np.linspace(-np.pi/4, np.pi/4, res))\n",
        "    exact_points, exact, min_c, max_c = EXACT_VALS_CACHE[problem_type]\n",
        "\n",
        "    zz = scipy.interpolate.griddata(\n",
        "        points=dfb[['gamma', 'beta']].values,\n",
        "        values=dfb['energy'].values / min_c,\n",
        "        xi=(xx, yy),\n",
        "        method=method,\n",
        "    )\n",
        "\n",
        "    fig, (axl, axr) = plt.subplots(1, 2, figsize=(5*2, 5), sharey=True)\n",
        "    norm = plt.Normalize(max_c/min_c, min_c/min_c)\n",
        "    cmap = 'RdBu'\n",
        "    extent=(0, 4, -2, 2)\n",
        "    \n",
        "    axl.imshow(zz, extent=extent, origin='lower', cmap=cmap, norm=norm, interpolation='none')\n",
        "    axl.set_xlabel(r'$\\gamma\\ /\\ (\\pi/8)$')\n",
        "    axl.set_ylabel(r'$\\beta\\ /\\ (\\pi/8)$')\n",
        "    axl.set_title('Experiment')\n",
        "    \n",
        "    zz_exact = scipy.interpolate.griddata(\n",
        "        points=exact_points,\n",
        "        values=(exact/min_c),\n",
        "        xi=(xx, yy),\n",
        "        method=method,\n",
        "    )\n",
        "\n",
        "    g = axr.imshow(zz_exact, extent=extent, origin='lower', cmap=cmap, norm=norm, interpolation='none')\n",
        "    axr.set_xlabel(r'$\\gamma\\ /\\ (\\pi/8)$')\n",
        "    axr.set_title('Theory')\n",
        "\n",
        "    fig.colorbar(g, ax=[axl, axr], shrink=0.8)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fOY9HQHIGNmj"
      },
      "source": [
        "### Hardware grid"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "id": "nkakglWKGNmk"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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3bt3x6BBg5CYmChrXxY97Z6IiIgslbwxRPn5+UZDYB68JA48ejxxcXExAECtVhu23f+3VqutUP7q1asAgICAAIwePRrff/89Fi5cCBcXF/Tr1++RcTIhIiKrI8gYhK5ylO4AVzlIl3FRO8qKSW45KXImAWhkrEItZ3KCnNWslV6pWk59co5PzorXTjL2Jef/Te7/rZzzSc55Kef8tgiivEtm9erVe2QvzaPGE8+cORNAefKjUqkM/wYAFxeXCuWjoqIQHh6OunXrAihPjH777Tfs3r3bdhKir776ytwhEBER0QOUGFT9qPHEOTk5WLVqFW7evAlXV1cA/72MVtmgaUEQDMnQfc2aNcOJEyck4+AYIiIiIjKZKJZfMpN6VIePjw8aN26M1NRUw7bU1FQ0bNiwwoBqAFi+fDneeOMNo20ZGRlo1qyZ5L6spoeIiIiILIgookxX87fuGDFiBNauXYsnnngCjo6OWLt2LV599VXD63l5edBoNHB1dUVYWBjGjBmDHTt2oGfPnjh+/DgOHDhg+QszEhERkZUSAbEWbs0xbtw45OXlYfr06XBwcEBERATGjRtneP3ll1/G0KFDMW3aNISGhmLNmjXYuHEjVq1ahaeeegpr1641mrZfFSZEREREZDIRYq3czd7R0RFz5szBnDlzKn394THG/fv3R//+/U3eDxMiIiIiMl0trVRdW5gQERER0WNhQkRERET2TRShZ0JERERE9kwURehlzTKzjlTDOqIkInqASsYKxHVU0sus1XNRSZYpE6VXXwaAOjJWM9bKWF1ZzkrVclZgVmoVaqVXqpZTxtLep7oyzhNA3vkk57yUc35bCrFMXvuwBkyIiIiIyHQieMmMiIiI7JuI8jve2womRERERGQ6UYSel8yIiIjIromAXitjpWoruWsqEyIiIiIymShCXg8REyLLV7+OsofftpG7ovUBQLGM2RamcBSUnb3gUAOzIfQKX5OWO0tILmcZs1JM5eMqbxYLEZHlEOUtzGglH292nRARERHRYxKV/wFrTkyIiIiIyGQiuA4RERER2TveuoOIiIjsnSgCei0TIiIis1E7Sg/m99TI+HjzkC7iJuOWHABQ6KqWLKOrxfEWcm7/oPQkCznkTHKwtPepjkreOeDpLH3OyTkv5ZzfFoErVRMRERGJXKmaiIiI7JvsdYisBBMiIiIieiyy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\n",
            "text/plain": [
              "<Figure size 720x360 with 3 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "plot_landscape('HardwareGridProblem')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "89-h2nj8GNmp"
      },
      "source": [
        "### SK model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "id": "B7uXeEq5GNmp"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 720x360 with 3 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "plot_landscape('SKProblem')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "i7yh6WoDGNmt"
      },
      "source": [
        "## 3 regular MaxCut"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {
        "id": "gF5V0w7VGNmt"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 720x360 with 3 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "plot_landscape('ThreeRegularProblem')"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "name": "landscape_analysis.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
